home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok82 / plot / source / formelauswertung.def < prev    next >
Text File  |  1993-11-04  |  6KB  |  121 lines

  1. DEFINITION MODULE Formelauswertung;
  2. (*
  3.   Created:   30.8.87
  4.   Changed:   12.02.88/29.8.88/1.10.88 by
  5.              Stefan Salewski
  6.              Stolper Weg 3
  7.              2160 Stade   West-Germany
  8.              Tel: 04141/61130
  9.  
  10.   Note: compiled with AMIGA Modula-2 System by AMSoft from 5.5.88
  11.   This Module may be freely copied. But please
  12.   leave my name in. Thanks....Stefan
  13.  
  14.  
  15.   Berechnung von Formeln in Form von Strings
  16.   ------------------------------------------
  17.   Dieses Modul macht es möglich, Programme zu schreiben, die
  18.   beliebige mathematische Formeln in Form eines Strings einlesen,
  19.   die Formel überprüfen und dann beliebig oft berechnen. Damit
  20.   wird ein Nachteil, den Modula gegenüber Interpreter-Sprachen wie
  21.   Basic hat, aufgehoben.
  22.   Benutzung dieses Moduls:
  23.   Zuerst liest man die mathematische Formel in Form eines Strings ein,
  24.   dieser String muß vom Typ Formelstring sein.
  25.   Danach muß mit AssignLong oder AssignFFP allen Variablen, die in der
  26.   Formel vorkommen, ein (vorläufiger) Wert zugewiesen werden.
  27.   Dann wird DefFormel mit diesem String und einer beliebigen Formelnummer
  28.   zwischen 1 und 10 aufgerufen. Ist der String ein korrekter mathematischer
  29.   Ausdruck, wie er z.B. auch von R.o.M. verwendet wird, (z.B. 'sin(3.5*x)'
  30.   oder '34/34.55+12.34E-123*sinh(12.7-2.12)-12.34^34') so ist die Fehlernummer
  31.   gleich Null. Nun können die Variablen mit AssignFFP oder AssignLong
  32.   beliebig geändert werden, und die Formel kann mit Longberechnung oder
  33.   FFPBerechnung beliebig oft berechnet werden.
  34.   Sowohl DefFormel als auch FFPBerechnung und LongBerechnung liefern
  35.   bei Fehlern Fehlernummern. Diese Fehlernummer sollte nach jeder
  36.   Berechnung abgefragt werden. Ist sie ungleich Null, so kann man mit
  37.   dem Modul FormelausFText die Ursache des Fehlers in Form eines Textes
  38.   erfahren.
  39.   Die Geschwindigkeit der Berechnung ist, wie man an R.o.M. sieht, recht
  40.   hoch. FFPBerechnung braucht zur Berechnung einer Formel ungefähr
  41.   doppelt so lange wie es dauern würde, die selbe Formel in compilierter
  42.   Form zu berechnen. Bei LongBerechnung wird dagegen kaum ein Unterschied
  43.   zu der compilierten Formel bemerkbar sein, da die Zeit, die für die
  44.   Interpretation der Formel benötigt wird, sehr klein gegenüber der
  45.   Zeit, die LongReal-Berechnungen in Anspruch nehmen, ist.
  46.   Eine Procedure RealBerechnung existiert momentan nicht, der Grund
  47.   dafür ist, daß Bereichsüberschreitungen bei arithmetischen
  48.   Operationen zwischen REAL-Zahlen keine definierten Resultate ergeben.
  49.   Also kann ich diese Überläufe nicht sicher festelllen und daher
  50.   nicht für die Korrektheit des Ergebnisses garantieren.
  51.   Formeln mit verschiedener Formelnummer können unabhängig voneinander
  52.   benutzt werden. Man kann also mehrere Formeln definieren und dann
  53.   abwechselnd berechnen lassen. Formelnummer 0 nicht verwenden, sie wird
  54.   intern benutzt.
  55. *)
  56.  
  57. FROM SYSTEM IMPORT FFP;
  58.   CONST
  59.     StrLength=255; (* so groß dürfen die zu berechnenden Ausdrücke sein  *)
  60.     AnzahlFormeln=10;(* Zahl der Formeln die gleichzeitig benutzt werden    *)
  61.                      (* können, Nummer 0 nicht verwenden                   *)
  62.   TYPE
  63.     Formelnummer=[0..AnzahlFormeln];
  64.     Formelstring=ARRAY[0..StrLength] OF CHAR;
  65.     (* Formelnummer 0 nicht benutzen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
  66.  
  67. VAR
  68. (* Achtung: Normalerweise sollte die Definition von Variablen über
  69.    AssignLong und AssignFFP erfolgen. Wenn es sehr auf die Geschwindigkeit
  70.    ankommt, können auch vorsichtig direkt an varListLong und varListFFP
  71.    Werte zugewiesen werden.
  72.    Ok:=AssignFFP('x',23.456) entspricht varListFFP['x']:=23.456
  73. *)
  74.   varListLong:ARRAY['A'..'z'] OF LONGREAL;
  75.   varListFFP:ARRAY['A'..'z'] OF FFP;
  76.  
  77.   PROCEDURE AssignLong(c:CHAR;x:LONGREAL):BOOLEAN;
  78.   (* Weist der Variablen c den Wert x zu                                    *)
  79.   (* c ist Buchstabe => TRUE                                                *)
  80.  
  81.   PROCEDURE AssignFFP(c:CHAR;x:FFP):BOOLEAN;
  82.   (* Weist der Variablen c den Wert x zu                                    *)
  83.   (* c ist Buchstabe => TRUE                                                *)
  84.  
  85.   PROCEDURE ClearVar(c:CHAR);
  86.   (* Variable c gilt als undefiniert und kann nicht mehr in Formeln
  87.      benutzt werden                                                         *)
  88.  
  89.   PROCEDURE GetLongValue(c:CHAR;VAR x:LONGREAL):BOOLEAN;
  90.   (* TRUE wenn dem Buchstaben c bereits ein Wert zugewiesen wurde           *)
  91.  
  92.   PROCEDURE GetFFPValue(c:CHAR;VAR x:FFP):BOOLEAN;
  93.   (* TRUE wenn dem Buchstaben c bereits ein Wert zugewiesen wurde           *)
  94.  
  95.   PROCEDURE DefFormel(nummer:Formelnummer;VAR str:ARRAY OF CHAR;
  96.                       korrekt,onlyLong:BOOLEAN):CARDINAL;
  97.  
  98.   (* Definiert eine neue Formel.Ist korrekt=TRUE, so ist 4+3*8= 28 sonst 56 *)
  99.   (*str wird nicht verändert,bei Fehler bleibt die alte Formel unverändert  *)
  100.   (*Ist onlyLong=TRUE, so können in der Formel auch Zahlen > 1.0E18 vor-    *)
  101.   (*kommen, dann darf aber nicht FFPBerechnung benutzt werden               *)
  102.   (* Fehlernummern:                                                         *)
  103.   (* 0:Kein Fehler                                                          *)
  104.   (* 31:Formel ist leer                                                     *)
  105.   (* 32:nicht alle Variablen sind initialisiert(mit Assign...)              *)
  106.   (* 33:Syntaxfehler                                                        *)
  107.   (* 34:Formel enthält ungültiges Zeichen                                 *)
  108.   (* 35:Formel enthält zu große Zahlen                                    *)
  109.  
  110.   PROCEDURE FFPBerechnung(nummer:Formelnummer;VAR ergebnis:FFP;
  111.                   VAR fehlernummer:CARDINAL);
  112.  
  113.   PROCEDURE LongBerechnung(nummer:Formelnummer;VAR ergebnis:LONGREAL;
  114.                            VAR fehlernummer:CARDINAL);
  115.  
  116.   (* Kein Fehler bei Berechnung  => Fehlernummer=0                          *)
  117.  
  118.  
  119. END Formelauswertung.def
  120.  
  121.